﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using estudent.Models;

namespace estudent.Controllers
{
    public class KartotecniListController : Controller
    {
        estudentEnt db = null;
        IEnumerable<Vpisi> vpisiStudenta = null;
        string vpisna = "";

        public KartotecniListController()
        {
            db = new estudentEnt();

        }

        //
        // GET: /KartotecniList/

        public ActionResult Index()
        {
            //pogledamo, ali ima nas student razlicne smeri glede vpisov
            vpisna=Session["Name"].ToString();
            IEnumerable<Vpisi> vpisi = db.Vpisis.Where(v=>v.username==vpisna);//dobimo vpise
            IEnumerable<SSmeri> smeri = from s in db.SSmeris
                                        join v in vpisi on s.sSmer equals v.sSmer
                                        select s;
            
            smeri = smeri.Distinct();
            if(smeri.Count()>1)
                ViewData["smeri"] = smeri;


            return View("SeznamOcen");
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public string Prikazi(FormCollection form)
        {   
            vpisna=Session["Name"].ToString();
            if (form["smer"] != null)
            {
                string studProgSmer=form["smer"];
                if(studProgSmer.CompareTo("neglede")==0)
                    vpisiStudenta = db.Vpisis.Where(v => v.username == vpisna).OrderBy(v=>v.letoVpisa);
                else
                    vpisiStudenta = db.Vpisis.Where(v => v.username == vpisna && v.sSmer == studProgSmer).OrderBy(v => v.letoVpisa);
            }
            else
                vpisiStudenta = db.Vpisis.Where(v => v.username == vpisna).OrderBy(v => v.letoVpisa);


            Studenti student = db.Studentis.FirstOrDefault(s=>s.username==vpisna);
            //gremo lepo po njegovih vpisi
            string result = "<p><b>Pregled ocen - "+vpisna+" "+student.ime+" "+student.priimek+"</b></p>";
            foreach (var vpis in vpisiStudenta)
            {
                result += "<table bgcolor='#F2F2F2' border='0' cellpadding='2' cellspacing='2'>";
                result += "<tr>";
                result += "<td><b>Študijsko leto:</b> "+vpis.letoVpisa.Year+"/"+(vpis.letoVpisa.Year+1)+"&nbsp;</td>";
                result += "<td><b>Smer:</b> "+vpis.SSmeri.sSmer+" -> "+vpis.SSmeri.imeSmer+"</td>";
                result += "</tr>";
                result += "<tr>";
                result += "<td><b>Letnik:</b> "+vpis.LetnikiStudija.opisLetnika+"</td>";
                result += "<td><b>Vrsta vpisa:</b> "+vpis.VrsteVpisa.opisVrste+"</td>";
                result += "</tr>";
                result += "<tr>";
                result += "<td><b>Način:</b> "+((vpis.redni==true) ? "redni" : "izredni")+"</td>";
                result += "<td><b>Skupina:</b> "+vpis.skupina+"</td>";
                result += "</tr>";
                result += "</table>";
                result += "<br/>";

                result+="<table border='1' cellpadding='0' cellspacing='0'>";
                result+="<tr align='center'>";
                result+="<th>Zap. št.</th>";
                result+="<th>Predmet</th>";
                result+="<th>KT</th>";
                result+="<th>Profesor</th>";
                result+="<th>Datum</th>";
                result+="<th>Ocena</th>";
                result+="<th colspan='2'>Št. polaganj</th>";
                result+="<th>Opravljen</th>";
                result+="</tr>";
                //IEnumerable<ObvezenPredmet> obvezniPredmId = db.ObvezenPredmets.Where(o=>o.sSmer==vpis.sSmer && o.idLetnikStudija==vpis.LetnikiStudija.idLetnikStudija);
                IEnumerable<sPredmeti> obvezni = vpis.sPredmetis;//from p in db.sPredmetis
                                                 //from p2 in obvezniPredmId
                                                 //where p.sPredmeta == p2.sPredmeta
                                                 //select p;

                IEnumerable<PrijaveNaIzpit> prijave = vpis.PrijaveNaIzpits;

                //k obveznim bomo uturili se strokovne,izbrine al pa modulske predmete
                //IEnumerable<sPredmeti> drugiPred = vpis.sPredmetis;
                //obvezni = obvezni.Union(drugiPred);
                

                double povpIzp = 0.0;
                double povpVaj = 0.0;
                double povpOcen = 0.0;
                int stTock = 0;
                int delitelj = 0;
                int deliPovpOcen = 0;
                int dosezeneTock = 0;

                int i = 1;
                foreach(var pred in obvezni){
                    result+="<tr align='center'>";
                    result+="<td>"+(i++)+".</td>";
                    result+="<td>"+pred.imePredmeta+"</td>";
                    result+="<td>"+pred.stKreditnih+"</td>";

                    stTock += (int)pred.stKreditnih;

                    IEnumerable<PrijaveNaIzpit> prijaveNaPredmet = (prijave.Where(p => p.IzpitniRoki.Poucuje.sPredmeta == pred.sPredmeta && ((p.koncnaOcena != null && p.koncnaOcena != -1) || (p.koncnaOcenaVaj != null)))).OrderBy(p => p.datumRoka);

                    string partialResult = "";

                    if (prijaveNaPredmet.Count()>0)
                    {
                        int stPolaganj = 0;
                        int stPolaganjVTrenutnemLetu = 0;
                        DateTime prejsnji = new DateTime(10,1,1);
                        foreach (var p in prijaveNaPredmet)
                        {
                            if (prejsnji != null&&!vDatumu(prejsnji,p.datumRoka))
                            {
                                stPolaganjVTrenutnemLetu = 0;
                            }
                            if (stPolaganj <= 0)
                            {
                                if (form["polaganje"].CompareTo("vsa") == 0)
                                {
                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    result += "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        result += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        result += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        result += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    result += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////
                                    

                                    result += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    result += "<td>" + p.koncnaOcena + ""+((p.koncnaOcenaVaj!=null)? "/"+p.koncnaOcenaVaj : "")+"</td>";
                                    result += "<td>" + (stPolaganj + 1) + "</td>";
                                    result += "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    result += "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";

                                    
                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj==null)? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj<6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;
                                }
                                else
                                {
                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    partialResult = "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        partialResult += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        partialResult += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        partialResult += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    partialResult += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////

                                    partialResult += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    partialResult += "<td>" + p.koncnaOcena + ((p.koncnaOcenaVaj != null) ? "/" + p.koncnaOcenaVaj : "") + "</td>";
                                    partialResult+= "<td>" + (stPolaganj + 1) + "</td>";
                                    partialResult+= "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    partialResult+= "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";

                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj == null) ? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;
                                }
                            }
                            else
                            {
                                if (form["polaganje"].CompareTo("vsa") == 0)
                                {
                                    result += "<tr align='center'>";
                                    result += "<td>" + (i++) + ".</td>";
                                    result += "<td>&nbsp;</td>";
                                    result += "<td>&nbsp;</td>";

                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    result += "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        result += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        result += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        result += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    result += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////

                                    result += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    result += "<td>" + p.koncnaOcena + ((p.koncnaOcenaVaj!=null)? "/"+p.koncnaOcenaVaj : "") + "</td>";
                                    result += "<td>" + (stPolaganj + 1) + "</td>";
                                    result += "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    result += "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";

                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj==null)? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj<6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;
                                }
                                else
                                {
                                    //profesorje dobit iz prijave in potem posredno iz izpitnega roka, ce je kombinacija
                                    partialResult = "<td>";
                                    IzpitniRoki rok = p.IzpitniRoki;//dobimo rok iz prijave
                                    if (rok != null)
                                        partialResult += rok.Poucuje.SProfesorji1.priimekProfesor + " " + rok.Poucuje.SProfesorji1.imeProfesor;
                                    if (rok.Poucuje.SProfesorji2 != null)
                                    {
                                        SProfesorji prof2 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji2.sProfesor);
                                        partialResult += ", " + prof2.priimekProfesor + " " + prof2.imeProfesor;
                                    }
                                    if (rok.Poucuje.SProfesorji != null)
                                    {
                                        SProfesorji prof3 = db.SProfesorjis.FirstOrDefault(pr => pr.sProfesor == rok.Poucuje.SProfesorji.sProfesor);
                                        partialResult += ", " + prof3.priimekProfesor + " " + prof3.imeProfesor;
                                    }
                                    partialResult += "</td>";
                                    /////////////////////////////////////////////////////////////////////////////////////

                                    partialResult += "<td>" + String.Format("{0:dd/MM/yyyy HH:mm}", p.datumRoka) + "</td>";
                                    partialResult += "<td>" + p.koncnaOcena + ((p.koncnaOcenaVaj != null) ? "/" + p.koncnaOcenaVaj : "") + "</td>";
                                    partialResult += "<td>" + (stPolaganj + 1) + "</td>";
                                    partialResult += "<td>" + (stPolaganjVTrenutnemLetu + 1) + "</td>";
                                    partialResult += "<td>" + ((p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? "NE" : "DA") + "</td>";

                                    povpVaj += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0.0 : (double)p.koncnaOcenaVaj;
                                    povpIzp += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0.0 : (double)p.koncnaOcena;
                                    povpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0.0 : ((double)p.koncnaOcena + ((p.koncnaOcenaVaj == null) ? 0.0 : (double)p.koncnaOcenaVaj));
                                    deliPovpOcen += (p.koncnaOcena == null || p.koncnaOcena < 6) ? 0 : 1;
                                    deliPovpOcen += (p.koncnaOcenaVaj == null || p.koncnaOcenaVaj < 6) ? 0 : 1;
                                    delitelj += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : 1;

                                    dosezeneTock += (p.koncnaOcena == null || p.koncnaOcena < 6 || p.koncnaOcenaVaj < 6) ? 0 : (int)pred.stKreditnih;

                                }
                            }

                            stPolaganj++;
                            stPolaganjVTrenutnemLetu++;
                            prejsnji = p.datumRoka;
                        }

                        if (form["polaganje"].CompareTo("zadnje") == 0)
                        {
                            result += partialResult;
                        }

                    }
                    else
                    {
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result += "<td>&nbsp;</td>";
                        result+="<td>NE</td>";
                    }

                    result += "</tr>";
                }
                result+="</table>";

                //se povprecje ocen
                result += "<table bgcolor='#f1f1f1'>";
                result += "<tr>";
                result += "<td style='width:200px'>";
                result += "<b>Povprečje izpitov:</b> " +povpIzp/delitelj;
                result += "</td>";
                result += "<td  style='width:200px'>";
                result += "<b>Povprečje vaj:</b> " + povpVaj / delitelj;
                result += "</td>";
                result += "<td  style='width:200px'>";
                result += "<b>Povprečna ocena:</b> " + povpOcen / deliPovpOcen;
                result += "</td>";
                result += "</tr>";
                result += "<tr>";
                result += "<td colspan='3'  style='width:600px'>";
                result += "<b>Skupno število kreditnih točk/ur:</b> "+ dosezeneTock +" od "+ stTock;
                result += "</td>";
                result += "</tr>";
                result += "</table></br></br>";

            }

            return result;
        }

        [NonAction]
        private bool vDatumu(DateTime poznan, DateTime nov)
        {
            //ustvart interval na podlagi poznanega datuma
            int p = poznan.Year * 365 + poznan.Month * 31 + poznan.Day;
            int n = nov.Year * 365 + nov.Month * 31 + nov.Day;

            DateTime t1 = new DateTime(poznan.Year,10,1);
            DateTime t2 = new DateTime(poznan.Year, 12, 31);

            if (poznan >= t1 && poznan <= t2)
            {
                //prva polovica
                DateTime p1 = new DateTime(poznan.Year,10,1);
                DateTime p2 = new DateTime(poznan.Year+1, 9, 30);
                if (nov >= p1 && nov <= p2)
                    return true;
            }
            else
            {
                //druga polovica
                DateTime p1 = new DateTime(poznan.Year-1, 10, 1);
                DateTime p2 = new DateTime(poznan.Year, 9, 30);
                if (nov >= p1 && nov <= p2)
                    return true;
            }

            return false;
        }

    }
}
